package cn.zhx.domain.strategy.repository;

import cn.zhx.domain.strategy.model.entity.StrategyAwardEntity;
import cn.zhx.domain.strategy.model.entity.StrategyEntity;
import cn.zhx.domain.strategy.model.entity.StrategyRuleEntity;
import cn.zhx.domain.strategy.model.valobj.RuleTreeVO;
import cn.zhx.domain.strategy.model.valobj.RuleWeightVO;
import cn.zhx.domain.strategy.model.valobj.StrategyAwardRuleModelVO;
import cn.zhx.domain.strategy.model.valobj.StrategyAwardStockKeyVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: zhx
 * @Date: 2024/07/02
 * @Description: 策略的仓储接口
 **/
public interface IStrategyRepository {
    /**
     * 查询策略奖品列表
     * @param strategyId 策略id
     * @return 策略奖品实体列表
     */
    List<StrategyAwardEntity> queryStragegyAwardList(Long strategyId);

    /**
     * 存储策略抽奖概率查找表
     * @param key strategyId
     * @param rateRange 查找表的元素数量
     * @param shuffleStrategyAwardSearchRateTables 查找表
     */
    void storeStrategyAwardSearchRateTables(String key, BigDecimal rateRange, HashMap<Integer, Integer> shuffleStrategyAwardSearchRateTables);

    /**
     * 查询查找表的元素数量
     * @param strategyId 策略id
     * @return 查找表的元素数量
     */
    int getRateRange(Long strategyId);

    /**
     * 查询查找表的元素数量
     * @param key redis key
     * @return 查找表的元素数量
     */
    int getRateRange(String key);

    /**
     * 查询策略奖品
     * @param key redis key
     * @param rateKey 随机值
     * @return 策略奖品id
     */
    Integer getStrategyAwardAssemble(String key, int rateKey);

    /**
     * 查询策略实体
     * @param strategyId 策略id
     * @return 策略实体
     */
    StrategyEntity queryStrategyEntityByStrategyId(Long strategyId);

    /**
     * 查询抽奖规则
     * @param strategyId 策略id
     * @param strategyRule 抽奖规则
     * @return 抽奖规则实体
     */
    StrategyRuleEntity queryStrategyRule(Long strategyId, String strategyRule);

    /**
     * 查询抽奖规则
     * @param strategyId 策略id
     * @param awardId 奖品id
     * @param ruleModel 抽奖规则
     * @return ruleValue
     */
    String queryStrategyRuleValue(Long strategyId, Integer awardId, String ruleModel);
    String queryStrategyRuleValue(Long strategyId,String ruleModel);

    /**
     * 查询策略奖品抽奖规则
     * @param strategyId 策略id
     * @param awardId 奖品id
     * @return 策略奖品抽奖规则
     */
    StrategyAwardRuleModelVO queryStrategyAwardRuleModelVO(Long strategyId, Integer awardId);

    /**
     * 查询规则树
     * @param treeId 规则树id
     * @return 规则树
     */
    RuleTreeVO queryRuleTreeVOByTreeId(String treeId);

    /**
     * 缓存奖品库存
     * @param cacheKey 缓存key
     * @param awardCount 奖品库存
     */
    void cacheStrategyAwardCount(String cacheKey, Integer awardCount);

    /**
     * 扣减库存
     * @param cacheKey 缓存key
     * @return 成功/失败
     */
    Boolean subtractionAwardStock(String cacheKey,Long strategyId, Integer awardId);

    /**
     * 扣减库存
     * @param cacheKey 缓存key
     * @return 成功/失败
     */
    Boolean subtractionAwardStock(String cacheKey, Long strategyId, Integer awardId, Date endDateTime);

    /**
     *  写入延迟队列
     * @param strategyAwardStockKeyVO
     */
    void awardStockConsumeSendQueue(StrategyAwardStockKeyVO strategyAwardStockKeyVO);

    /**
     * 获取延迟队列中的消息
     * @return
     */
    StrategyAwardStockKeyVO takeQueueValue();

    /**
     * 更新数据库表中的库存信息
     * @param strategyId 策略id
     * @param awardId 奖品id
     */
    void updateStrategyAwardStock(Long strategyId, Integer awardId);

    /**
     * 根据策略id和奖品id查询奖品信息
     * @param strategyId 策略id
     * @param awardId 奖品id
     * @return 奖品信息
     */
    StrategyAwardEntity queryStrategyAwardEntity(Long strategyId, Integer awardId);

    /**
     * 清空队列
     */
    void clearQueueValue();

    /**
     * 清空库存
     * @param strategyId 策略id
     * @param awardId 奖品id
     */
    void clearStrategyAwardStock(Long strategyId, Integer awardId);

    /**
     * 根据活动id查询策略id
     * @param activityId 活动id
     * @return 策略id
     */
    Long queryStrategyIdByActivityId(Long activityId);
    /**
     * 根据规则树id 查询奖品规则
     * @return
     */
    Map<String, Integer> queryAwardRuleLockCount(String[] treeIds);

    /**
     * 根据策略id 查询奖品规则权重信息
     * @param strategyId 策略id
     * @return List<RuleWeightVO>
     */
    List<RuleWeightVO> queryAwardRuleWeight(Long strategyId);

    /**
     * 根据策略id和用户id 查询活动账户总使用次数
     * @param userId 用户id
     * @param strategyId 策略id
     * @return 活动账户总使用次数
     */
    Integer queryActivityAccountTotalUseCount(String userId, Long strategyId);
}
